//////////////////////////////////////////////////////////////////////////
//
// NO_exception.h
//
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
#ifndef NO_EXCEPTION_H
#define NO_EXCEPTION_H

//////////////////////////////////////////////////////////////////////////
template <class Exception = std::exception>
class NO_Exception : public Exception
{
	//////////////////////////////////////////////////////////////////////////
	typedef void (*LogFuncPtr)(const char*,...);
	
public:
	//////////////////////////////////////////////////////////////////////////
	typedef NO_Exception& (NO_Exception::*StreamMod)(void);

	//////////////////////////////////////////////////////////////////////////
	NO_Exception(void):Exception("NanoOctane-Exception ")	{}
	NO_Exception(const char* msg):Exception(msg)			{}
	NO_Exception(const NO_Exception& rhs):Exception(rhs)	{}
	virtual ~NO_Exception()									{}

	//////////////////////////////////////////////////////////////////////////
	NO_Exception& operator=(const NO_Exception& rhs){Exception::operator=(rhs); return *this;}
	NO_Exception& operator=(const Exception& rhs)	{Exception::operator=(rhs); return *this;}

	//////////////////////////////////////////////////////////////////////////
	template <class Type>
	NO_Exception& operator<<(const Type& data)
	{
		std::stringstream sstr;
		sstr<<Exception::what()<<data;
		*this=Exception(sstr.str().c_str());
		return *this;
	}

	//////////////////////////////////////////////////////////////////////////
	NO_Exception& operator<<(LogFuncPtr func)
	{
		(*func)(what());
		return *this;
	}
};

//////////////////////////////////////////////////////////////////////////
typedef NO_Exception<std::exception> NO_Error;
typedef NO_Exception<std::exception> NO_BadAlloc;

#endif
